import VueI18n from 'vue-i18n'
import { getI18n } from '@/util/api'
import Vue from 'vue'
import { locale } from 'core-js'

Vue.use(VueI18n)

// 语言包缓存
const languageCache = new Map()
// 保存缺失的key，按语言分类
const missingKeysMap = new Map()
let debounceTimer = null
let loadingPromise = null

const i18n = new VueI18n({
    locale: 'zh',
    fallbackLocale: 'zh',
    messages: {}, // 先空
    missing: (locale, key) => {
        // 记录缺失的key
        if (!missingKeysMap.has(locale)) {
            missingKeysMap.set(locale, new Set())
        }
        missingKeysMap.get(locale).add(key)

        // 防抖加载缺失的key
        clearTimeout(debounceTimer)
        debounceTimer = setTimeout(() => {
            loadMissingKeys(locale)
        }, 300)

        return '---' // 返回key作为占位
    }
})

// // 保存缺失 key
// const missingKeys = new Set()
// let loadingPromise = null

// // 保存原始 $t
// const originalT = i18n.t.bind(i18n)

// // 重写 $t，自动收集缺失 key
// i18n.t = function(key, ...args) {
//   const messages = i18n.getLocaleMessage(i18n.locale)
//   if (!messages[key]) {
//     missingKeys.add(key)
//     // 启动后台请求一次缺失 key（防止重复请求）
//     if (!loadingPromise) loadingPromise = loadMissingKeys().finally(() => loadingPromise = null)
//     return key
//   }
//   return originalT(key, ...args)
// }

async function loadMissingKeys(locale) {
    const missingKeys = missingKeysMap.get(locale)
    if (!missingKeys || missingKeys.size === 0) return

    // 复制当前缺失的key并清空集合
    const keysToLoad = Array.from(missingKeys)
    missingKeys.clear()

    try {
        // 如果有正在进行的请求，等待它完成
        if (loadingPromise) {
            await loadingPromise
        }
        loadingPromise = getI18n({
            lang: locale,
            keys: keysToLoad.join(',')
        })
        const res = await loadingPromise
        const currentMessages = i18n.getLocaleMessage(locale) || {}
        
        // 合并新的翻译
        i18n.setLocaleMessage(locale, { ...currentMessages, ...res.data })

        // 更新缓存
        if (!languageCache.has(locale)) {
            languageCache.set(locale, {})
        }
        Object.assign(languageCache.get(locale), res.data)
    } catch (error) {
        console.error('加载翻译失败:', error)
        // 将失败的key重新加入集合
        keysToLoad.forEach(key => {
            missingKeysMap.get(locale).add(key)
        })
    } finally {
        loadingPromise = null
    }
}

export async function switchLanguage(locale) {
  if (i18n.locale === locale) return 
  // 如果有缓存了直接使用
  if (languageCache.has(locale)) {
    i18n.locale = locale
  } else {
    // 初始化一个空对象，保证 VueI18n 有对应的 locale
    i18n.setLocaleMessage(locale, {}) 
    languageCache.set(locale, {}) // 只作为标记，说明已经初始化过
    // 切换语言
    i18n.locale = locale
  }
}

Vue.prototype.$t = function(key, ...args) {
  return i18n.t(key, ...args)
}